package Thread;
/**
 * 2个线程 2把锁 出现死锁的情况
 */


/*
"t1加锁locker2完成"和"t2加锁locker1完成"这两个操作都没有执行到,说明这两线程都在第二次加锁的时候阻塞
 */
public class Demo21 {
    private static Object locker1 = new Object();//先定义两个锁对象
    private static Object locker2 = new Object();//先定义两个锁对象

    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (locker1) {
                System.out.println("t1加锁locker1完成");

                //这里的sleep是为了确保,t1和t2都分别拿到locker1和locker2然后再分别拿对方的锁
                //如果这里没有sleep执行顺序就不可控,可能出现某个线程一次性拿到两把锁,另一个线程都还没执行,无法构造出死锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                synchronized (locker2) {
                    System.out.println("t1加锁locker2完成");
                }
            }
        });
        Thread t2 = new Thread(() -> {
            synchronized (locker2) {
                System.out.println("t2加锁locker1完成");

                //这里的sleep是为了确保,t1和t2都分别拿到locker1和locker2然后再分别拿对方的锁
                //如果这里没有sleep执行顺序就不可控,可能出现某个线程一次性拿到两把锁,另一个线程都还没执行,无法构造出死锁
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                synchronized (locker1) {
                    System.out.println("t2加锁locker2完成");
                }
            }
        });

        t1.start();
        t2.start();
    }
}

//两个线程出现两把锁的问题
class demo21{
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{

        });
    }
}
